<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

require_once APPPATH . 'controllers/admin.php';

/**
 * Контроллер объединения жанров видео
 *
 * @package CoreFramework
 * @version 1.0
 * @author Gennadiy Kozlenko
 */
class Admin_Join_Genres extends Admin {
   
   /**
    * Идентификаторы жанров для объединения
    *
    * @access private
    * @var array
    */
   var $_ids = array();
   
   /**
    * Идентификаторы всех жанров, которые были выбранны для объединения
    *
    * @var array
    */
   var $_all_ids = array();
   
   /**
    * Конструктор класса
    *
    * @access public
    * @return Admin_Join_Genres
    */
   function Admin_Join_Genres() {
      parent::Admin();
      $this->set_menu(6, 2);
      // Выковыриваем идентификаторы выбранных жанров
      $this->_all_ids = $this->input->post('ids');
      $this->_ids = $this->_all_ids;
      if (count($this->_all_ids) < 2) {
         $this->redirect('admin_manage_genres');
      }
      $this->load->language('video');
   } // end Admin_Join_Genres
   
   /**
    * Метод по умолчанию
    *
    * @access public
    */
   function index() {
      $data = array();
      // Стандартные поля (берем из первого жанра)
      reset($this->_ids);
      $id_genre = current($this->_ids);
      $this->load->model('m_genre');
      $this->m_genre->set_id($id_genre);
      
      $title = $this->m_genre->get('title');
      $slug = $this->m_genre->get('slug');
      // Валидируем и, если нужно, объединяем
      if (false !== $this->input->post('edit')) {
         $this->load->library('validation');
         $rules = array(
            'title' => 'trim|required|max_length[100]',
            'slug'  => 'trim|callback_check_slug|max_length[100]',
         );
         $this->validation->set_rules($rules);
         $result = $this->validation->run();
         // Получаем из поста поля
         $title = $this->validation->title;
         if (isset($this->validation->slug) && !empty($this->validation->slug)) {
            $slug = $this->validation->slug;
         } else {
            // Генерируем uri segment (если не задан)
            $this->load->helper('text');
            // Транслитерируем
            $slug = transliteration($title);
            // Строим урл
            $slug = url_title($slug, 'dash', true);
            // Лимитируем
            $slug = substr($slug, 0, 97);
            // Подстраиваем uri segment так, чтобы он был уникальным в пределах нужного уровня
            $i = 0;
            $sep = '-';
            if (empty($slug)) {
               $sep = '';
            }
            $uri = $slug;
            while (empty($uri) || !$this->check_slug($uri)) {
               $uri = $slug . $sep . (string) ++$i;
            }
            $slug = $uri;
         }
         // Валидируем выбранные жанры для объединения
         $this->_ids = $this->input->post('ch_ids');
         if (!is_array($this->_ids)) {
            $this->_ids = array();
         }
         if (count($this->_ids) < 2) {
            $this->errors->set('genres', $this->lang->line('check_genres_error'));
            $result = false;
         }
         if ($result) {
            // Если проверки пройдены успешно, объединяем записи
            $ids = $this->_ids;
            // Выбираем первый жанр как основной
            $id_genre = array_shift($ids);
            $this->load->model('m_genre');
            
            // Получаем все видео, у которых проставлены выбранные жанры (кроме основного)
            $this->db->select('id_video')
               ->from('video_genres')
               ->where_in('id_genre', $ids)
               ->group_by('id_video');
            $query = $this->db->get();
            if (0 < $query->num_rows()) {
               $videos = array();
               $results = $query->result_array();
               foreach ($results as $row) {
                  array_push($videos, $row['id_video']);
               }
               // У этих видео убираем все выбранные жанры
               $this->db->where_in('id_genre', $this->_ids)
                  ->where_in('id_video', $videos)
                  ->delete('video_genres');
               // Всем видео добавляем основной жанр
               foreach ($videos as $id_video) {
                  $this->db->insert('video_genres', array('id_video' => $id_video, 'id_genre' => $id_genre));
               }
            }
            
            // Удаляем уже ненужные жанры
            foreach ($ids as $id) {
               $this->m_genre->set_id($id);
               $this->m_genre->delete();
            }
            
            // Обновляем основной жанр
            $this->m_genre->set_id($id_genre);
            $this->m_genre->set('title', $title);
            $this->m_genre->set('slug', $slug);
            $this->m_genre->update();
            
            // Сообщение об успехе
            $this->set_message($this->lang->line('join_genres_succ'), 'info', true);
            $this->redirect('admin_manage_genres');
         }
      }
      // Список жанров для объединения
      $genres = array();
      $this->load->model('m_table');
      $this->load->helper('element');
      $this->m_table->set_table('genres');
      $this->m_table->add_restriction('id_genre', $this->_all_ids);
      $this->m_table->add_sort('title');
      $this->m_table->load_results();
      if (0 < $this->m_table->get_count()) {
         $results = $this->m_table->get_results();
         foreach ($results as $row) {
            $genre = array(
               'title'    => htmlspecialchars($row['title']),
               'slug'     => htmlspecialchars($row['slug']),
               'hidden'   => create_hidden('ids[]', $row['id_genre']),
               'checkbox' => create_checkbox('ch_ids[]', in_array($row['id_genre'], $this->_ids), 'value="' . $row['id_genre'] . '"')
            );
            array_push($genres, $genre);
         }
      }
      $data['genres'] = $genres;
      
      // Забиваем в дату поля
      $data['title'] = htmlspecialchars($title);
      $data['slug'] = htmlspecialchars($slug);
      
      // Выводим
      $view = 'admin/join_genres.html';
      $this->set_content($this->parser->parse($view, $data, true));
      $this->display();
   } // end index
   
   /**
    * Функция валидирования uri сегмента на уникальность
    *
    * @access public
    * @param string $name
    * @return boolean
    */
   function check_slug($slug) {
      if (!empty($slug)) {
         if ($this->validation->alpha_dash($slug)) {
            $this->load->model('m_table');
            $this->m_table->set_table('genres');
            $this->m_table->add_restriction('slug', $slug);
            $this->m_table->add_restriction('id_genre', $this->_ids, '<>');
            $this->m_table->load_results();
            if (0 == $this->m_table->get_count()) {
               return true;
            } else {
               $this->validation->set_message('check_slug', $this->lang->line('check_slug_error'));
            }
         } else {
            $this->validation->set_message('check_slug', $this->lang->line('alpha_dash'));
         }
         return false;
      }
      return true;
   } // end check_slug
   
}
